package com.app.util;

import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class IdCardCheckUtils {
    // 18 位身份证号码的权重
    private static final int[] idCardWeight18 = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
    // 18 位身份证号码的校验码
    private static final Map<Integer, Character> idCardCheck18 = new HashMap<>();
    static {
        idCardCheck18.put(0, '1');
        idCardCheck18.put(1, '0');
        idCardCheck18.put(2, 'X');
        idCardCheck18.put(3, '9');
        idCardCheck18.put(4, '8');
        idCardCheck18.put(5, '7');
        idCardCheck18.put(6, '6');
        idCardCheck18.put(7, '5');
        idCardCheck18.put(8, '4');
        idCardCheck18.put(9, '3');
        idCardCheck18.put(10, '2');
    }

    // 校验身份证号码
    public static boolean idCardNumberCheck(String idCardNumber) {
        // 去除空格
        idCardNumber = idCardNumber.replaceAll(" ", "");

        // 校验是否为纯数字
        if (!idCardNumber.matches("\\d+")) {
            System.out.println("身份证号码必须为纯数字");
            return false;
        }

        // 15 位身份证号码校验
        if (idCardNumber.length() == 15) {
            if (!idCardNumber.matches("^\\d{15}$")) {
                System.out.println("15 位身份证号码格式错误");
                return false;
            }
            return true;
        }

        // 18 位身份证号码校验
        if (idCardNumber.length() == 18) {
            // 校验前 17 位是否为数字
            String first17 = idCardNumber.substring(0, 17);
            if (!first17.matches("^\\d{17}$")) {
                System.out.println("18 位身份证号码前 17 位必须为数字");
                return false;
            }

            int sum = 0;
            for (int i = 0; i < 17; i++) {
                sum += (idCardNumber.charAt(i) - '0') * idCardWeight18[i];
            }
            int remainder = sum % 11;

            char checkCode = idCardNumber.charAt(17);
            if (idCardCheck18.get(remainder)!= checkCode) {
                System.out.println("18 位身份证号码校验码错误");
                return false;
            }
            return true;
        }

        System.out.println("身份证号码位数必须为 15 位或 18 位");
        return false;
    }

    public static void main(String[] args) {
        String idCardNumber = "622123200111301222";
        if (idCardNumberCheck(idCardNumber)) {
            System.out.println("身份证号码格式正确");
        } else {
            System.out.println("身份证号码格式错误");
        }
    }
}
